package com.mililoan.common.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

public class FTPUtils {
	 private static Logger logger = Logger.getLogger(FTPUtils.class); 
	 
	 /**
	  * 获取FTP客户端
	  * @param ftpHost
	  * @param ftpPassword
	  * @param ftpUserName
	  * @param ftpPort
	  * @return
	  */
	 public static FTPClient getFTPClient(String ftpHost, String ftpPassword, String ftpUserName, int ftpPort) {  
		FTPClient ftpClient = null;  
		try {  
		    ftpClient = new FTPClient();  
		    ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器  
		    ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器  
			if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  
			    logger.info("未连接到FTP，用户名或密码错误。");  
			    ftpClient.disconnect();  
			} else {  
			    logger.info("FTP连接成功。");  
		    }  
		} catch (SocketException e) {  
		    e.printStackTrace();  
		    logger.info("FTP的IP地址可能错误，请正确配置。");  
		} catch (IOException e) {  
		    e.printStackTrace();  
		    logger.info("FTP的端口错误,请正确配置。");  
		}  
		return ftpClient;  
	 }
	 
	 public static String readFileForFTP(String ftpUserName, String ftpPassword, String ftpPath, String ftpHost, int ftpPort, String fileName) throws UnsupportedEncodingException {  
		 StringBuffer resultBuffer = new StringBuffer();  
		 FileInputStream inFile = null;  
		 InputStream in = null;  
		 FTPClient ftpClient = null;  
//		 logger.info("开始读取绝对路径" + ftpPath + "文件!");  
	     try {  
	    	 	ftpClient = FTPUtils.getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort);  
	            ftpClient.setControlEncoding("UTF-8"); // 中文支持  
	            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
	            ftpClient.enterLocalPassiveMode();  
	            ftpClient.changeWorkingDirectory(ftpPath);  
	            in = ftpClient.retrieveFileStream(fileName);  
	        } catch (FileNotFoundException e) {  
	            logger.error("没有找到" + ftpPath + "文件");  
	            e.printStackTrace();  
	            return "下载配置文件失败，请联系管理员.";  
	        } catch (SocketException e) {  
	            logger.error("连接FTP失败.");  
	            e.printStackTrace();  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	            logger.error("文件读取错误。");  
	            e.printStackTrace();  
	            return "配置文件读取失败，请联系管理员.";  
	        }  
	     	
	     if (in != null) {  
	    	 BufferedReader br = new BufferedReader(new InputStreamReader(in,"GBK"));  
	         String data = null;  
	         try {  
				while ((data = br.readLine()) != null) {  
				    resultBuffer.append(data + "\n");  
				}  
	         } catch (IOException e) {  
	                logger.error("文件读取错误。");  
	                e.printStackTrace();  
	                return "配置文件读取失败，请联系管理员.";  
	            }finally{  
	                try {  
	                    ftpClient.disconnect();  
	                } catch (IOException e) {  
	                    e.printStackTrace();  
	                }  
	            }  
	        } else{  
	            logger.error("in为空，不能读取。");  
	            return "配置文件读取失败，请联系管理员.";  
	        }  
	        return resultBuffer.toString();  
	 }  
	 
	 /** 
	     * 本地上传文件到FTP服务器 
	     *  
	     * @param ftpPath 
	     *            远程文件路径FTP 
	     * @throws IOException 
	     */  
	    public static void upload(String ftpPath, String ftpUserName, String ftpPassword,  
	            String ftpHost, int ftpPort, String fileContent,  
	            String writeTempFielPath) {  
	        FTPClient ftpClient = null;  
	        logger.info("开始上传文件到FTP.");  
	        try {  
	            ftpClient = FTPUtils.getFTPClient(ftpHost, ftpPassword,  
	                    ftpUserName, ftpPort);  
	            // 设置PassiveMode传输  
	            ftpClient.enterLocalPassiveMode();  
	            // 设置以二进制流的方式传输  
	            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
	            // 对远程目录的处理  
	            String remoteFileName = ftpPath;  
	            if (ftpPath.contains("/")) {  
	                remoteFileName = ftpPath  
	                        .substring(ftpPath.lastIndexOf("/") + 1);  
	            }  
	   
	            // 先把文件写在本地。在上传到FTP上最后在删除  
	            boolean writeResult = write(remoteFileName, fileContent,  
	                    writeTempFielPath);  
	            if (writeResult) {  
	                File f = new File(writeTempFielPath + "/" + remoteFileName);  
	                InputStream in = new FileInputStream(f);  
	                ftpClient.storeFile(writeTempFielPath+"/"+remoteFileName, in);  
	                in.close();  
	                logger.info("上传文件" + remoteFileName + "到FTP成功!");  
	                f.delete();  
	            } else {  
	                logger.info("写文件失败!");  
	            }  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }finally{  
	            try {  
	                ftpClient.disconnect();  
	            } catch (IOException e) {  
	                e.printStackTrace();  
	            }  
	        }  
	    }  
	  
	    /** 
	     * 把配置文件先写到本地的一个文件中取 
	     *  
	     * @param ftpPath 
	     * @param str 
	     * @return 
	     */  
	    public static boolean write(String fileName, String fileContext,  
	            String writeTempFielPath) {  
	        try {  
	            logger.info("开始写配置文件");  
	            File f = new File(writeTempFielPath + "/" + fileName);  
	            
	            if(!f.exists()){  
	                if(!f.createNewFile()){  
	                    logger.info("文件不存在，创建失败!");  
	                }  
	            }  
	            logger.info(f.getAbsoluteFile());  
	            BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));  
	            bw.write(fileContext.replaceAll("\n", "\r\n"));  
	            bw.flush();  
	            bw.close();  
	            return true;  
	        } catch (Exception e) {  
	            logger.error("写文件没有成功");  
	            e.printStackTrace();  
	            return false;  
	        }  
	    }  
}
